package com.community.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.community.mapper.MenuMapper;
import com.community.mapper.MenuPermissionMapper;
import com.community.mapper.PermissionMapper;
import com.community.mapper.RoleMenuMapper;
import com.community.pojo.*;
import com.community.service.IMenuService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * <p>
 * 菜单表 服务实现类
 * </p>
 *
 * @author TangHaoSong Fly ChenJie HeYuHang
 * @since 2024-05-15
 */
@Service
public class MenuServiceImpl extends ServiceImpl<MenuMapper, Menu> implements IMenuService {


    @Autowired
    private RoleMenuMapper roleMenuMapper;
    @Autowired
    private MenuMapper menuMapper;
    @Autowired
    private MenuPermissionMapper menuPermissionMapper;
    @Autowired
    private PermissionMapper permissionMapper;

    @Override
    public List<Menu> getMenuListByRoles(List<Role> roles) {
        // 构建菜单列表
        List<Menu> menus = new ArrayList<>();

        // 遍历角色列表
        for (Role role : roles) {
            // 构建查询条件，根据角色ID查询角色菜单关联表中的记录
            QueryWrapper<RoleMenu> queryWrapper = new QueryWrapper<>();
            queryWrapper.eq("role_id", role.getId());

            // 查询角色菜单关联表中的记录
            List<RoleMenu> roleMenus = roleMenuMapper.selectList(queryWrapper);

            // 遍历角色菜单关联表中的记录，获取对应的菜单信息
            for (RoleMenu roleMenu : roleMenus) {
                Integer menuId = roleMenu.getMenuId();
                // 根据菜单ID查询菜单信息
                Menu menu = menuMapper.selectOne(new QueryWrapper<Menu>().eq("id", menuId).eq("is_delete", 0));
                if (menu != null && menu.getStatus() != 1) {
                    // 如果菜单信息不为空，并且 isDelete 不为 1 且 status 不为 1，则将其加入菜单列表
                    menus.add(menu);
                }
            }
        }

        // 返回菜单列表
        return menus;
    }

    @Override
    public List<Permission> getPermissionsByMenu(Menu menu) {
        // 构建查询条件，根据菜单ID查询菜单权限关联表中的记录
        QueryWrapper<MenuPermission> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("menu_id", menu.getId());

        // 查询菜单权限关联表中的记录
        List<MenuPermission> menuPermissions = menuPermissionMapper.selectList(queryWrapper);

        // 构建权限列表
        List<Permission> permissions = new ArrayList<>();

        // 遍历菜单权限关联表中的记录，获取对应的权限信息
        for (MenuPermission menuPermission : menuPermissions) {
            Integer permissionId = menuPermission.getPermissionId();
            // 根据权限ID查询权限信息
            Permission permission = permissionMapper.selectById(permissionId);

            if (permission != null && permission.getIsDelete() == 0 && permission.getStatus()==0) {
                // 如果权限信息不为空，且未被删除（is_delete 为 0），则将其加入权限列表
                permissions.add(permission);
            }
        }

        // 返回权限列表
        return permissions;
    }

    @Override
    public List<Menu> getMenusByRoleId(Integer roleId) {
        // 创建查询条件
        QueryWrapper<RoleMenu> wrapper = new QueryWrapper<>();
        wrapper.eq("role_id", roleId);

        // 执行查询操作
        List<RoleMenu> roleMenuList = roleMenuMapper.selectList(wrapper);

        // 提取菜单ID列表
        List<Integer> menuIdList = new ArrayList<>();
        for (RoleMenu roleMenu : roleMenuList) {
            menuIdList.add(roleMenu.getMenuId());
        }

        List<Menu> menuList = new ArrayList<>();
        if (!menuIdList.isEmpty()) {
            // 查询菜单列表
            QueryWrapper<Menu> menuWrapper = new QueryWrapper<>();
            menuWrapper.in("id", menuIdList);
            menuList = menuMapper.selectList(menuWrapper);
        }

        return menuList;
    }

    @Override
    public List<Permission> getPermissionsByMenu1(Menu menu) {
        // 构建查询条件，根据菜单ID查询菜单权限关联表中的记录
        QueryWrapper<MenuPermission> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("menu_id", menu.getId());

        // 查询菜单权限关联表中的记录
        List<MenuPermission> menuPermissions = menuPermissionMapper.selectList(queryWrapper);

        // 构建权限列表
        List<Permission> permissions = new ArrayList<>();

        // 遍历菜单权限关联表中的记录，获取对应的权限信息
        for (MenuPermission menuPermission : menuPermissions) {
            Integer permissionId = menuPermission.getPermissionId();
            // 根据权限ID查询权限信息
            Permission permission = permissionMapper.selectById(permissionId);

            if (permission != null && permission.getIsDelete() == 0 ) {
                // 如果权限信息不为空，且未被删除（is_delete 为 0），则将其加入权限列表
                permissions.add(permission);
            }
        }

        // 返回权限列表
        return permissions;
    }
}
